
////1、按秩优化————————————
////按秩优化
////联通操作log(N)
////合并操作log(N)
//
//#include <iostream>
//using namespace std;
//const int N = 1e5 + 10;
//int fa[N]; //存储该节点的父节点
//int Size[N + 5];
//
//void Init(int n)
//{
//	for (int i = 0; i <= n; i++) {
//		fa[i] = i;
//		Size[i] = 1; //每一个节点单独作为子树
//	}
//
//}
//
//int find(int x)
//{
//	if (fa[x] == x) return x; //当该节点的父节点为自己时，此时该节点为根节点
//	return find(fa[x]);//找到x的根节点
//}
//
//int merge(int a, int b)
//{
//	int aa = find(a), bb = find(b);
//	if (aa == bb)return 0;
//	if (Size[aa] < Size[bb]){
//		fa[aa] = bb;
//		Size[bb] += Size[aa];
//	}
//	else{
//		fa[bb] = aa;
//		Size[aa] += Size[bb];
//	}
//
//	return 1;
//}
//
//void output(int n) //输出每个节点的颜色
//{
//	int ret = 0;
//	for (int i = 0; i <= n; i++)
//	{
//		ret += printf("%3d", i);
//	}
//
//	cout << "\n";
//	for (int i = 0; i < ret; i++)printf("-");
//	cout << "\n";
//
//	for (int i = 0; i <= n; i++) printf("%3d", fa[i]);
//	cout << "\n";
//
//	for (int i = 0; i <= n; i++) printf("%3d", Size[i]);
//	cout << "\n";
//
//}
//
//
//int main()
//{
//	int n;
//	cin >> n;
//	Init(n);
//	int a, b;
//	while (cin >> a >> b)
//	{
//		printf("merge %d with %d : %d\n", a, b, merge(a, b));
//		output(n);
//	}
//
//	return 0;
//}


//数据测试
//10
//0 1
//8 9
//9 10
//1 9


//路径压缩 ——————————————————————————

//加上路径压缩之后
//联通操作O(1)
//合并操作O(1)
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int fa[N]; //存储该节点的父节点
int Size[N + 5];

void Init(int n)
{
	for (int i = 0; i <= n; i++) {
		fa[i] = i;
		Size[i] = 1; //每一个节点单独作为子树
	}

}

int find(int x) //路径压缩
{
	return fa[x] = (fa[x] == x ? x : find(fa[x]));
}

int merge(int a, int b)
{
	int aa = find(a), bb = find(b);
	if (aa == bb)return 0;
	if (Size[aa] < Size[bb]) {
		fa[aa] = bb;
		Size[bb] += Size[aa];
	}
	else {
		fa[bb] = aa;
		Size[aa] += Size[bb];
	}

	return 1;
}

void output(int n) //输出每个节点的颜色
{
	int ret = 0;
	for (int i = 0; i <= n; i++)
	{
		ret += printf("%3d", i);
	}

	cout << "\n";
	for (int i = 0; i < ret; i++)printf("-");
	cout << "\n";

	for (int i = 0; i <= n; i++) printf("%3d", fa[i]);
	cout << "\n";

	for (int i = 0; i <= n; i++) printf("%3d", Size[i]);
	cout << "\n";

}

int main()
{
	int n;
	cin >> n;
	Init(n);
	int a, b;
	while (cin >> a >> b)
	{
		printf("merge %d with %d : %d\n", a, b, merge(a, b));
		output(n);
	}
	return 0;
}